/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package src.j2ee.compumake.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import src.j2ee.compumake.dominio.Arquitectura;
import src.j2ee.compumake.dominio.Marca;
import src.j2ee.compumake.dominio.Procesador;
import src.j2ee.compumake.dominio.Producto;
import src.j2ee.compumake.dominio.Socket;
import src.j2ee.compumake.dominio.TarjetaMadre;

/************************************************************************
 **                                                                    **
 ** Nombre: DAOProcesador.java                                         **
 ** Version: v1.0.0                                                    **
 ** Autor: amado.cante                                                 **
 ** Creado: 25/04/2013                                                 **
 ** Modificado:                                                        **
 ** Diagrama:                                                          **
 ** Caso de uso:                                                       **
 **                                                                    **
 ***********************************************************************/
public class DAOProcesador {
    private static final String TABLA_PROCESADORES = "Procesadores";
    private static final String COLUMNA_ID_PROCESADOR = "idProcesador";
    private static final String MARCA = "marca";
    private static final String NOMBRE = "nombre";
    private static final String SOCKET = "socket";
    private static final String ARQUITECTURA = "arquitectura";
    private DAOMarca daomarca;
    private Connection conexion;
    private AccesoBaseDatos acceso = new AccesoBaseDatos();
    
    public DAOProcesador(){
        this.conexion = this.acceso.abrirConexion();
    }
    
    public Procesador insertaProcesador(Procesador procesador){
        Procesador p;
        try{
            String query = "INSERT INTO "+TABLA_PROCESADORES+" ("+MARCA+","
                    +NOMBRE+","+SOCKET+","+ARQUITECTURA+") VALUES ('"
                    +procesador.getMarca().getClave()+"','"+procesador.getNombre()
                    +"','"+procesador.getSocket().getClave()+"','"
                    +procesador.getArquitectura().getClaveArquitectura()+"');";
            PreparedStatement sentencia = conexion.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
            int afectados = sentencia.executeUpdate();
            if(afectados==0){
                return null;
            }else{
                ResultSet generado = sentencia.getGeneratedKeys();
                if(generado.next()){
                    int id = generado.getInt(1);
                    p = procesador;
                    p.setClave(id);
                    return p;
                }else{
                    return null;
                }
            }
        }
        catch (SQLException ex) {
            return null;
        }
    }
    
    public Procesador buscaProcesador(int idProcesador){
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT * FROM "+TABLA_PROCESADORES+" WHERE "+COLUMNA_ID_PROCESADOR
                    +"='"+idProcesador+"';";
            ResultSet resultado = sentencia.executeQuery(query);
            DAOSocket daosocket = new DAOSocket();
            DAOArquitectura daoarquitectura = new DAOArquitectura();
            daomarca = new DAOMarca();
            DAOProducto daoproducto = new DAOProducto();
            if(resultado.first()){
                int idMarca = resultado.getInt(2);
                String nombre = resultado.getString(3);
                int idSocket = resultado.getInt(4);
                int idArquitectura = resultado.getInt(5);
                Socket socket = daosocket.buscaSocket(idSocket);
                Marca marca = daomarca.buscaMarca(idMarca);
                Arquitectura arquitectura = daoarquitectura.buscarArquitectura(idArquitectura);
                int existencias = daoproducto.obtenerExistenciaProducto(idProcesador, (daoproducto.getTipos().get(Procesador.class)).intValue());
                String ruta = daoproducto.obtenerRutaImagen(idProcesador, (daoproducto.getTipos().get(Procesador.class)).intValue());
                double precio = daoproducto.obtenerPrecioProducto(idProcesador, (daoproducto.getTipos().get(Procesador.class)).intValue());
                Procesador procesador = new Procesador(idProcesador, socket, arquitectura, nombre, marca, existencias, ruta, precio);
                return procesador;
            }
        }catch(SQLException ex){
            return null;
        }
        return null;
    }
    
    public ArrayList<Procesador> listarProcesadores(){
        ArrayList<Procesador> procesadores = new ArrayList<>();
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT "+COLUMNA_ID_PROCESADOR+" FROM "+TABLA_PROCESADORES;
            ResultSet resultado = sentencia.executeQuery(query);
            while(resultado.next()){
                int idProcesador = resultado.getInt(1);
                Procesador p = this.buscaProcesador(idProcesador);
                if(p!=null){
                    procesadores.add(p);
                }
            }
            return procesadores;
        }
        catch (SQLException ex) {
            return procesadores;
        }
    }
    
    public ArrayList<Producto> listarCompatibles(TarjetaMadre tarjetaMadre){
        ArrayList<Producto> procesadores = new ArrayList<>();
        try {
            String query= "SELECT "+COLUMNA_ID_PROCESADOR+" FROM "+TABLA_PROCESADORES+" WHERE "+ARQUITECTURA
                    +" IN "+this.obtenerCadenaArquitecturas(tarjetaMadre.getArquitecturas())
                    +" AND "+SOCKET+" IN "+this.obtenerCadenaSockets(tarjetaMadre.getSockets());
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(query);
            while(resultado.next()){
                int idProcesador=resultado.getInt(1);
                Procesador p = this.buscaProcesador(idProcesador);
                if(p!=null){
                    procesadores.add(p);
                }
            }
            return procesadores;
        } catch (SQLException ex) {
            return procesadores;
        }
    }
    
    private String obtenerCadenaArquitecturas(ArrayList<Arquitectura> arquitecturas){
        String cadenaArquitectura="(";
        if(arquitecturas.size()>0){
            cadenaArquitectura+="'"+arquitecturas.get(0).getClaveArquitectura()+"'";
            for(int i=1; i<arquitecturas.size();i++){
                cadenaArquitectura+=",'"+arquitecturas.get(i).getClaveArquitectura()+"'";
            }
            cadenaArquitectura+=")";
        }
        return cadenaArquitectura;
    }
    private String obtenerCadenaSockets(ArrayList<Socket> sockets){
        String cadenaSockets="(";
        if(sockets.size()>0){
            cadenaSockets+="'"+sockets.get(0).getClave()+"'";
            for(int i=1; i<sockets.size();i++){
                cadenaSockets+=",'"+sockets.get(i).getClave()+"'";
            }
            cadenaSockets+=")";
        }
        return cadenaSockets;
    }
}
